package com.yunzhijia.open;

import com.alibaba.fastjson.JSON;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
/**
 *Fastjson API入口类是com.alibaba.fastjson.JSON，常用的序列化操作都可以在JSON类上的静态方法直接完成。
 public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
 public static final JSONObject parseObject(String text)； // 把JSON文本parse成JSONObject
 public static final  T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
 public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
 public static final  List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
 public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
 public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。
 */
/**
 * Created by ljg on 16/3/29.
 */
public class serverDept {
    /**
     * 查询全部组织信息 getDeptAll
     * 输入: 参见3.1、输入格式，具体data格式:
     {
     eid:string			//必填,注册号
     }
     输出: 参见3.2、输出格式，具体data格式:
     [{		    			//组织列表
     id:string			//组织的id
     parentId:string,		//组织父Id
     name:string,	    	        //组织名称
     depertment:string,		//组织长名称
     },…]
     */
    public void getDeptAll(){
        try {
            JsonNode jsonData = new JsonNode("{}"); // json data without encrypt
//            System.out.println(commonDifine.keyFilePath);
            byte[] keyByte = EncryptUtils.getBytesFromFile(commonDifine.keyFilePath);
            Key key = EncryptUtils.restorePrivateKey(keyByte);

            HttpResponse<JsonNode> jsonResponse = Unirest
                    .post(commonDifine.org_getDeptall_url)
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .field("eid", commonDifine.EID)//云之家团队ID
                    .field("nonce", UUID.randomUUID().toString())
                    .field("data",
                            EncryptUtils.encryptWithEncodeBase64UTF8(
                                    jsonData.toString(), key)).asJson();
            JsonFormatPrintf.printJson(jsonResponse.getBody().toString());
        } catch (UnirestException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 4.2、更新组织
     描述: 更新组织名称，每次更新记录不超过1000条
     URL: openaccess/input/dept/update
     方法: POST
     输入: 参见3.1、输入格式，具体data格式:
     {
     eid:string			//不必须，如果没有，则以外面的eid参数为准
     departments:[{
     department:string	//必填,原组织长名称
     todepartment:string	//必填,新组织长名称,路径中不存在的组织将会自动创建
     },...]
     }
     输出: 参见3.2、输出格式，如果更新组织全部成功，则data里返回[]，如果有未修改成功的，则未成功的记录会在data中会有具体错误信息，具体data格式:
     {
     [{
     msgId:string,		//原组织长名称
     msgCode:int		//消息码
     msg:string		//消息
     },…]
     }
     */
    public void updateDept(){
        try {
            JsonNode jsonData = new JsonNode("{}"); // json data without encrypt

            byte[] keyByte = EncryptUtils.getBytesFromFile(commonDifine.keyFilePath);
            Key key = EncryptUtils.restorePrivateKey(keyByte);

            HttpResponse<JsonNode> jsonResponse = Unirest
                    .post(commonDifine.org_updateDeptAll_url)
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .field("eid", commonDifine.EID)//云之家团队ID
                    .field("departments", "")
                    .field("data",
                            EncryptUtils.encryptWithEncodeBase64UTF8(
                                    jsonData.toString(), key)).asJson();
            JsonFormatPrintf.printJson(jsonResponse.getBody().toString());
        } catch (UnirestException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 描述: 新增组织，每次新增记录不超过1000条
     URL: openaccess/input/dept/add
     方法: POST
     输入: 参见3.1、输入格式，具体data格式:
     {
     eid:String,			//不必须，如果没有，则以外面的eid参数为准
     departments:[string,…]          //必填，组织长名称数组
     }
     输出: 参见3.2、输出格式，如果组织全部创建成功，则data里返回[]，如果有未创建成功的，则data中会有未创建成功的记录的具体信息，具体data格式:
     {
     [{
     msgId:string,		//组织长名称
     msgCode:int,		//消息码
     msg:string		//消息
     },…]
     }
     */
    public void addDept(String [] addJson){
        try {
            JsonNode jsonData = new JsonNode("{}"); // json data without encrypt
            JsonFormatPrintf.printJson(JSON.toJSONString(addJson, true));
            byte[] keyByte = EncryptUtils.getBytesFromFile(commonDifine.keyFilePath);
            Key key = EncryptUtils.restorePrivateKey(keyByte);

            HttpResponse<JsonNode> jsonResponse = Unirest
                    .post(commonDifine.org_addDept_url)
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .field("eid", commonDifine.EID)//云之家团队ID
                    .field("departments", JSON.toJSONString(addJson, true))
                    .field("data",
                            EncryptUtils.encryptWithEncodeBase64UTF8(
                                    jsonData.toString(), key)).asJson();

            JsonFormatPrintf.printJson(jsonResponse.getBody().toString());
        } catch (UnirestException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 4.3、删除组织
     描述: 根据组织长名称删除组织，如该组织及其子组织下存在“正常”的人员，则删除失败；
     若不存在“正常”的人员，则该组织及其子组织会被删除，同时把组织下“禁用”或“注销”的人员改为待分配状态
     URL: openaccess/input/dept/delete
     方法: POST
     输入: 参见3.1、输入格式，具体data格式:
     {
     eid:string			//不必须，如果没有，则以外面的eid参数为准
     departments:[string,…]		//必填,要删除的组织长名称数组
     }
     输出: 参见3.2、输出格式，具体data格式:
     {
     [{
     msgId:string,		//组织长名称
     msgCode:int		//消息码
     msg:string		//消息
     },…]
     }
     */
    public void deleteDept(String [] delJson){
        try {
            JsonNode jsonData = new JsonNode("{}"); // json data without encrypt
            JsonFormatPrintf.printJson(JSON.toJSONString(delJson, true));
            byte[] keyByte = EncryptUtils.getBytesFromFile(commonDifine.keyFilePath);
            Key key = EncryptUtils.restorePrivateKey(keyByte);

            HttpResponse<JsonNode> jsonResponse = Unirest
                    .post(commonDifine.org_deleteDept_url)
                    .header("Content-Type", "application/x-www-form-urlencoded")
                    .field("eid", commonDifine.EID)//云之家团队ID
                    .field("departments", JSON.toJSONString(delJson,true))
                    .field("data",
                            EncryptUtils.encryptWithEncodeBase64UTF8(
                                    jsonData.toString(), key)).asJson();

            JsonFormatPrintf.printJson(jsonResponse.getBody().toString());
        } catch (UnirestException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
